﻿/**
* ...
* @author 
* @version 0.1
*/

package AS3Events{	
		
	public class AS3EventClass{
		
		/**
		 * nome da classe de eventos
		 */
		private var eventClassName:String;
		
		/**
		 * array contendo as referencias dos listeners
		 */
		private var listeners:Array;
		
		/**
		 * construtor padrao da classe de evento
		 * @param	eventClassName nome da classe de eventos
		 */
		public function AS3EventClass(eventClassName:String) {
			this.eventClassName = eventClassName;
			this.listeners = new Array();
		}
			
		/**
		 * pega o nome da classe de eventos
		 * @return nome da classe de eventos
		 */
		public function getEventClassName():String
		{
			return this.eventClassName;
		}
		
		/**
		 * insere um listener no array de listeners
		 * @param	listener referencia do listener que vai ser inserido
		 */
		public function addListener(listener:AS3EventRouterListener):void
		{
			if(this.isListener(listener)==false)
				this.listeners.push(listener);
		}
		
		/**
		 * remove um listener
		 * @param	listener referencia para o listener
		 */
		public function removeListener(listener:AS3EventRouterListener):void
		{
			var length:Number = this.listeners.length;
			
			for(var i:Number = 0; i<length; i++)
			{
				var eventListener:AS3EventRouterListener = this.listeners[i];
				if(listener==eventListener)
				{
					//trace("removendo");
					this.listeners[i] = null;
					this.listeners.splice(i, 1);
					return;
				}
			}
			
		}
		
		/**
		 * remove um listener
		 * @param	listener referencia para o listener
		 */
		public function removeAllListeners():void
		{
			var length:Number = this.listeners.length;
			
			for(var i:Number = length-1; i>=0; i--)
			{
				var eventListener:AS3EventRouterListener = this.listeners[i];
				AS3EventRouter.RemoveListener(this.eventClassName, eventListener);
			}
		}
		
		public function sendEvent(message:AS3EventMessage):void
		{
			var length:Number = length;
			
			for(var i:Number = 0; i<this.listeners.length; i++)
			{
				//cast
				AS3EventRouterListener(this.listeners[i]).receiveEventRouterMessage(this.eventClassName, message.event, message);
			}
		}
		
		/**
		 * remove um listener
		 * @param	listener referencia para o listener
		 */
		public function isListener(listener:AS3EventRouterListener):Boolean
		{
			var length:Number = this.listeners.length;
			
			for(var i:Number = 0; i<length; i++)
			{
				var eventListener:AS3EventRouterListener = this.listeners[i];
				if(listener==eventListener)
				{
					return true;
				}
			}
			return false;
		}
		
		/**
		 * remove um listeners nulls do array de listeners
		 * @param	listener referencia para o listener
		 */
		public function removeNulls():void
		{
			var length:Number = this.listeners.length;
			
			for(var i:Number = 0; i<length; i++)
			{
				var eventListener:AS3EventRouterListener = this.listeners[i];
				if(eventListener==null)
				{
					this.listeners.splice(i,1);
				}
			}
		}
	}
}